package com.colin.gatewayservice.filter;

import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import com.colin.response.R;
import com.colin.response.RCM;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * SaToken的全局过滤器
 */
@Configuration
public class SaTokenFilterConfig {
    /**
     * 1. SaToken的全局过滤器 在处理不同请求方法时 不够灵活
     * 2. 返回的响应数据 处理起来也相对麻烦
     * 3. 随着你的分布式项目体量越来越大
     *  需要登录的接口可能出现的越来越多 不需要登录的接口也越来越多
     *  addInclude addExclude 会越来越难以配置和维护
     * 4. 如果某一个微服务新上线 那么这个微服务里面的需要鉴权的接口 在不重启网关的情况下 是没办法动态的添加到addInclude路径的
     */
    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
                // 拦截地址
                .addInclude("/user")
                // 开放地址
//                .addExclude("/favicon.ico")
                // 鉴权方法：每次访问进入
                .setAuth(obj -> {
                    // 登录校验 -- 拦截所有路由，并排除/user/doLogin 用于开放登录
                    SaRouter.match("/user", r -> StpUtil.checkLogin());
                })
                // 异常处理方法：每次setAuth函数出现异常时进入
                .setError(e -> R.error(RCM.ERROR));
    }
}
